#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QPushButton>
#include <QFileDialog>
#include <QTextStream>
#include <QLineEdit>
#include <QDialog>
#include <QLabel>

//主界面
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 初始化文件为未保存状态
    isUntitled = true;
    // 初始化文件名为"未命名.txt"
    curFile = tr("未命名.txt");
    // 初始化窗口标题为文件名
    setWindowTitle(curFile);

    findDlg = new QDialog(this);
    findDlg->setWindowTitle(tr("查找"));
    findLineEdit = new QLineEdit(findDlg);
    QPushButton *btn1 = new QPushButton(tr("查找下一个"), findDlg);
    QVBoxLayout *layout1 = new QVBoxLayout(findDlg);
    layout1->addWidget(findLineEdit);
    layout1->addWidget(btn1);
    connect(btn1, &QPushButton::clicked, this, &MainWindow::showFindText);

    ui->statusBar->showMessage(tr("欢迎访问Qt开源社区！"));

    QLabel *permanent = new QLabel;
    permanent->setFrameStyle(QFrame::Box | QFrame::Sunken);
    permanent->setText(
      tr("<a href=\"http://www.yafeilinux.com\">yafeilinux.com</a>"));
    permanent->setTextFormat(Qt::RichText);
    permanent->setOpenExternalLinks(true);
    ui->statusBar->addPermanentWidget(permanent);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::newFile()//新建文件
{

    if(maybeSave())
    {
        isUntitled = true;
        curFile = tr("未命名.txt");
        setWindowTitle(curFile);
        ui->textEdit->clear();
        ui->textEdit->setVisible(true);
    }
}

bool MainWindow::maybeSave()//保存判断
{
    //如果文件被修改了
    if(ui->textEdit->document()->isModified())
    {
        //自定义一个警告框
        QMessageBox box;
        box.setWindowTitle(tr("警告"));
        box.setIcon(QMessageBox::Warning);
        box.setText(curFile + tr("尚未保存，是否保存?"));

        QPushButton *yesBtn = box.addButton(tr("是(&Y)"),QMessageBox::YesRole);
                               box.addButton(tr("否(&N)"),QMessageBox::NoRole);
        QPushButton *cancelBut = box.addButton(tr("取消"),QMessageBox::RejectRole);

        box.exec();
        if(box.clickedButton() == yesBtn)
            return save();

        else if (box.clickedButton() == cancelBut)
            return false;
    }

    return true;
}

bool MainWindow::save()//是否保存
{
    if(isUntitled)
        return saveAs();
    else
        return saveFile(curFile);
}

bool MainWindow::saveAs()//另存为
{
    QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile);

    if(fileName.isEmpty()) return false;
    return saveFile(fileName);
}

bool MainWindow::saveFile(const QString &fileName)//保存
{
    QFile file(fileName);

    if(!file.open(QFile::WriteOnly|QFile::Text))
    {
        //1%和%2分别对应arg的两个参数，/n起换行作用
        QMessageBox::warning(this,tr("多文档编辑器"),
                             tr("无法写入文件1%：/n 2%")
                             .arg(fileName).arg(file.errorString()));
        return false;

    }
    QTextStream out(&file);
    //鼠标变为等待状态
    QApplication::setOverrideCursor(Qt::WaitCursor);
    out << ui->textEdit->toPlainText();
    //鼠标恢复原来的状态
    QApplication::restoreOverrideCursor();
    isUntitled = false;
    //获得文件路径
    curFile = QFileInfo(fileName).canonicalFilePath();
    setWindowTitle(curFile);
    return true;
}

//导入文本文件
bool MainWindow::loadFile(const QString &fileName)
{

    QFile file(fileName);//新建文件对象
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::warning(this,tr("多文档编辑器"),
                           tr("无法读取文件%1：\n%2.")
                           .arg(fileName).arg(file.errorString()));
        return false;//只读方式打开
    }

    QTextStream in(&file);//新建文本流对象
    QApplication::setOverrideCursor(Qt::WaitCursor);
    //读取文件全部内容 并添加到编辑器中

    ui->textEdit->setPlainText(in.readAll());
    QApplication::restoreOverrideCursor();

    //设置当前文件

    curFile = QFileInfo(fileName).canonicalFilePath();
    setWindowTitle(curFile);
    return true;
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    //如果maybesave()函数返回true，则关闭程序
    if(maybeSave())
    {
        event->accept();
    }

    else
    {
        event->ignore();//忽略该事件
    }
}


void MainWindow::on_New_triggered()//新建动作
{
    newFile();
}


void MainWindow::on_save_triggered()//保存动作
{
    save();
}


void MainWindow::on_SaveAs_triggered()//另存为动作
{
     saveAs();
}


void MainWindow::on_Open_triggered()//打开动作
{
    if(maybeSave()){

        QString fileName = QFileDialog::getOpenFileName(this);
        //如果文件不为空 则加载文件
        if(!fileName.isEmpty())
        {
            loadFile(fileName);
            ui->textEdit->setVisible(true);
        }
    }
}


void MainWindow::on_Close_triggered()//关闭动作
{
    if(maybeSave())
    {
        ui->textEdit->setVisible(false);
    }
}


void MainWindow::on_cut_triggered()//剪切动作
{
    ui->textEdit->cut();
}


void MainWindow::on_copy_triggered()//复制动作
{
    ui->textEdit->copy();
}


void MainWindow::on_paste_triggered()//粘贴动作
{
    ui->textEdit->paste();
}


void MainWindow::on_exit_triggered()//退出动作
{
    //先执行关闭动作 再退出程序
    //Qapp是指向应用程序的全局指针
    on_Close_triggered();
    qApp->quit();
}


void MainWindow::on_undo_triggered()//撤销动作
{
    ui->textEdit->undo();
}

void MainWindow::on_notes_triggered()//版本说明
{
    QMessageBox box;
    box.setWindowTitle(tr("说明"));
    box.setIcon(QMessageBox::Warning);
    box.setText(tr("作者:dyf007  版本:dyftxt 1.0"));
    box.exec();
}

void MainWindow::showFindText()
{
    QString str = findLineEdit->text();
    if(!ui->textEdit->find(str,QTextDocument::FindBackward))
    {
        QMessageBox::warning(this,tr("查找"),tr("找不到%1").arg(str));

    }
}

void MainWindow::on_find_triggered()
{
    findDlg->show();
}
